/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.telsoft.hms.lib.security.server;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.telsoft.hms.entity.ETT_AM_USER;
import com.telsoft.hms.lib.data.DBPool;
import com.telsoft.hms.lib.security.exception.SessionNotExistsException;
import com.telsoft.hms.lib.security.exception.SessionRejectedException;
import com.telsoft.hms.lib.security.exception.UserNotExistsException;
import com.telsoft.hms.lib.security.session.Session;
import com.telsoft.hms.lib.security.session.SessionManager;

/**
 * 
 * @author VIETPH
 */
public class WsRuntime {
	private Logger logger = LoggerFactory.getLogger(WsRuntime.class);
	private static SessionManager sessionManager;
	private WsConfig wsConfig;

	public WsRuntime() {
		if (wsConfig == null) {
			wsConfig = new WsConfig();
		}
		if (sessionManager == null) {
			sessionManager = new SessionManager(wsConfig.getThreadInterval());
		}
	}

	/**
	 * Khởi tạo Session cho USER đăng nhập
	 * 
	 * @param user
	 *            Thực thể AM_USER sau khi đăng nhập thành công
	 * @param maxSession
	 *            Số máy tối đa đăng nhập trên một tài khoản
	 * @param languageCode
	 *            Mã ngôn ngữ hiện tại
	 * @return Security Key Mã bảo mật
	 * @throws SessionRejectedException
	 *             xuất hiện khi số lượng đăng nhập của USER vượt quá giới hạn
	 */
	public String createSession(ETT_AM_USER user, int maxSession,
			int languageCode, String hospitalKey)
			throws SessionRejectedException {
		Session session = new Session(wsConfig.getSessionTimeOut());
		session.setUserId(user.getUserId());
		session.setUserName(user.getUserName());
		session.setMaxSessionAllowed(maxSession);
		session.setLanguageCode(languageCode);
		session.setHospitalKey(hospitalKey);
		sessionManager.addSession(session);
		//write key to log
		logger.info("==== Session created: " + session.getSecurityKey());
		return session.getSecurityKey();
	}

	/**
	 * Xóa Session trong list Session, dùng khi đăng xuất tài khoản
	 * 
	 * @param securityKey
	 *            Mã bảo mật
	 */
	public void removeSession(String securityKey) {
		if (securityKey != null) {
			sessionManager.removeSession(securityKey);
		}
		logger.info("==== Session removed: " + securityKey);
	}

	/**
	 * Cập nhật ngôn ngữ cho AM_USER
	 * 
	 * @param securityKey
	 *            Mã bảo mật
	 * @param languageCode
	 *            Mã ngôn ngữ cần cập nhật
	 * @throws SessionNotExistsException
	 *             xuất hiện khi Session không tồn tại
	 */
	public void updateLanguageCode(String securityKey, int languageCode)
			throws SessionNotExistsException {
		if (securityKey != null) {
			Session session = (Session) sessionManager.getSession(securityKey);
			session.renewSession();
			session.setLanguageCode(languageCode);
			logger.info("==== Session updated: " + securityKey + " === languageCode: " + languageCode);
		} else {
			throw new SessionNotExistsException("Hello Viet Nam");
		}
	}

	/**
	 * Kiểm tra tài khoản đã đăng nhập hay chưa
	 * 
	 * @param securityKey
	 *            Mã bảo mật
	 * @throws SessionNotExistsException
	 *             xuất hiện khi Session không tồn tại => chưa đăng nhập
	 */
	public Session validateSecurity(String securityKey)
			throws SessionNotExistsException {
		if (securityKey != null) {
			Session session = (Session) sessionManager.getSession(securityKey);			
			session.renewSession();
			logger.info("==== Session was renew: " + securityKey);
			return session;
		}
		throw new SessionNotExistsException("Hello Viet Nam");
	}
}
